JDBC是什么?
概念
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。-摘自百度百科
传统JDBC编程
- 代码示列
|
|
- 总结
通过以上代码,我们可以看到,传统JDBC编程需要冗余、复杂的操作,为此Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发。
Spring JDBC
概念
Spring通过抽象JDBC访问并提供一致的API来简化JDBC编程的工作量。我们只需要声明SQL、调用合适的Spring JDBC框架API、处理结果集即可。事务由Spring管理,并将JDBC受查异常转换为Spring一致的非受查异常,从而简化开发。
框架
Spring主要提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式简化JDBC编程。
本文以JDBC模板方式进行介绍
JDBC模板
JdbcTemplate
Spring里最基本的JDBC模板,利用JDBC和简单的索引参数查询提供对数据库的简单访问。NamedParameterJdbcTemplate
能够在执行查询时把值绑定到SQL里的命名参数,而不是使用索引参数。SimpleJdbcTemplate
利用Java 5的特性,比如自动装箱、通用(generic)和可变参数列表来简化JDBC模板的使用。
JdbcTemplate介绍
JdbcTemplate主要4类方法
execute
用于执行任何SQL语句,一般用于执行DDL语句。update/batchUpdate
update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句。query/queryForXXX
用于执行查询相关语句。call
用于执行存储过程、函数相关语句。
JdbcTemplate类支持的回调类
预编译语句及存储过程创建回调
用于根据JdbcTemplate提供的连接创建相应的语句
PreparedStatementCreator
通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的PreparedStatementCallableStatementCreator
通过回调获取JdbcTemplate提供的Connection,由用户使用该Conncetion创建相关的CallableStatement
预编译语句设值回调
用于给预编译语句相应参数设值
PreparedStatementSetter
通过回调获取JdbcTemplate提供的PreparedStatement,由用户来对相应的预编译语句相应参数设值BatchPreparedStatementSetter
类似于PreparedStatementSetter,但用于批处理,需要指定批处理大小
自定义功能回调
提供给用户一个扩展点,用户可以在指定类型的扩展点执行任何数量需要的操作
ConnectionCallback
通过回调获取JdbcTemplate提供的Connection,用户可在该Connection执行任何数量的操作StatementCallback
通过回调获取JdbcTemplate提供的Statement,用户可以在该Statement执行任何数量的操作PreparedStatementCallback
通过回调获取JdbcTemplate提供的PreparedStatement,用户可以在该PreparedStatement执行任何数量的操作CallableStatementCallback
通过回调获取JdbcTemplate提供的CallableStatement,用户可以在该CallableStatement执行任何数量的操作
结果集处理回调
通过回调处理ResultSet或将ResultSet转换为需要的形式
RowMapper
用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型RowCallbackHandler
用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可ResultSetExtractor
用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集
JdbcTemplate测试
使用JdbcTemplate模板类时必须通过DataSource获取数据库连接,然后在使用JdbcTemplate模板对数据库进行操作。
未使用回调
JdbcTemplate提供更简单的queryForXXX方法,来简化开发,参考一下代码。
|
|
结果集回调
|
|
其他回调
请参考其他文档,使用方法大同小异。
JdbcTemplate实践
Spring JDBC都是与IOC容器一起使用,通过配置方式使用Spring JDBC,一般都是使用JdbcTemplate类,Spring JDBC通过实现DaoSupport来支持一致的数据库访问。
Spring JDBC的DaoSupport实现
- JdbcDaoSupport:用于支持一致的JdbcTemplate访问
- NamedParameterJdbcDaoSupport:继承JdbcDaoSupport,同时提供NamedParameterJdbcTemplate访问
- SimpleJdbcDaoSupport:继承JdbcDaoSupport,同时提供SimpleJdbcTemplate访问
定义表结构
|
|
定义DAO
|
|
定义DAO的实现类
ps:实现类继承JdbcDaoSupport
|
|
定义service的实现类
|
|
xml文件配置
数据源
1234jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1/test?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&noAccessToProcedureBodies=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=123456bean的配置
123456789101112131415161718192021222324252627282930313233343536373839404142<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd"><!-- 加载配置文件 --><context:property-placeholder location="database.properties"/><!-- 注入jdbcutil类,为了测试原生JDBC --><bean id="jdbcTest" class="com.szl.springjdbc.util.JdbcUtil"></bean><!-- 配置数据源 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- 定义抽象的abstractDao,其有一个dataSource属性,从而可以让继承的子类自动继承dataSource属性注入--><bean id="abstractDao" abstract="true"><property name="dataSource" ref="dataSource"></property></bean><!-- 注入UserDaoImpl类,为了测试使用jdbcTemplate, 继承abstractDao,从而继承dataSource注入--><bean id="userDaoImpl" class="com.szl.springjdbc.dao.impl.UserDaoImpl" parent="abstractDao"></bean><!-- 注入UserServiceImpl类,为了测试使用jdbcTemplate --><bean id="userServiceImpl" class="com.szl.springjdbc.service.impl.UserServiceImpl"><property name="userDao" ref="userDaoImpl"></property></bean></beans>
测试类
|
|